#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,sys
from xmldoc import XmlDoc,XmlNode
from xpickle import node2data,data2node

class Conf(object):
    def __init__(self,fb,nodeConf):
        assert type(nodeConf == XmlNode)
        self.__nodeConf = nodeConf
        self.__fb = fb
        
    def __iter__(self):
        """ iter les "names" des item de la conf """
        for i in self.__nodeConf.getAll(u"key"):
            yield i.getAttr(u"name")
    def __len__(self):
        """ retourne le nb d'items de la conf """
        return len(self.__nodeConf.getAll(u"key"))
        
    def __getNode(self,n):
        """ retourne la XmlNode de l'item 'n' ou None """
        for i in self.__nodeConf.getAll(u"key"):
            attr = i.getAttr(u"name")
            if attr==n:
                return i
        return None
    def __getitem__(self,n):
        """ retourne la valeur de l'item 'n' dans la conf ou None """
        node = self.__getNode(n)
        if node:
            # recupere la 1er vrai node (y en a qu'une!) ou non
            for i in node.childNodes:
                if i.node.nodeType == i.node.ELEMENT_NODE:
                    return node2data( i.node )
                
        return None

    def __delitem__(self,n):
        """ supprime l'item 'n' dans la conf  """
        node = self.__getNode(n)
        if node:
            node.unlink()
            self.__fb.save()    # save conf
            return True
        return None

    def __setitem__(self,n,v):
        """ màj le contenu de l'item 'n' dans la conf
            s'il n'existait pas, on cree l'item en question
        """
        node = self.__getNode(n)
        if node:
            node.unlink()
            
        node=self.__nodeConf.ownerDocument.createNode(u"key",{u"name":n})
        newnode = self.__nodeConf.appendChild(node)
        
        nd=data2node(v)
        if nd:
            newnode.appendChild(XmlNode(nd))
        self.__fb.save()        # save conf



class FeedBox(object):
    
    def __init__(self,fileConf=None):
        if not fileConf:
            # try to determinate the fileConf
            
            try:
                #windows NT,2k,XP,etc. fallback
                home = os.environ['APPDATA']
            except:
                try:
                    #all user-based OSes
                    thd = os.path.expanduser("~")
                    if thd == "~": raise
                    home= thd
                except:
                    try:
                        #*nix fallback
                        home = os.environ['HOME']
                    except:
                        #What os are people using?
                        home = os.path.dirname(os.path.abspath(__file__))
            
            fileConf = os.path.join(home,".feedBox.xml")

        print "FeedBox Conf File : ",fileConf
        self.__file = fileConf

        if os.path.isfile(fileConf):
            self.__dom=XmlDoc(file=fileConf)
        else:
            # create the conf file
            self.__dom=XmlDoc(xml="<feedBox><conf/><plugins/></feedBox>")
            

    def checkConf(self):
        """ verifie que vlc est bien positionné et qu'il existe 
            sinon demande à l'utilisateur de le situer
            renvoi true : si vlc est ok
            renvoi false : si ça va pas
        """
        c=self.getConf()
        vlc = c["vlc"]
        if not( vlc and os.path.isfile(vlc) ):
            import easygui
            easygui.msgbox("""
                        C'est la première fois que vous lancer feedBox.
                        Veuillez selectionner votre VLC ...
                        ""","feedbox")
            vlc = easygui.fileopenbox()
            if vlc:
                c["vlc"] = vlc.decode( sys.getfilesystemencoding() )
                return True
            else:
                return False
        else:
            return True
           

    def getConf(self,plug=None):
        """ recupere l'objet de configuration (Conf())
            pour le plugin nommé "plug", sinon la conf globale de feedbox
        """
        if plug:
            nplug = self.__dom.getAll("plugins")[0]
            nodes = nplug.getAll(plug)
            if nodes:
                return Conf(self,nodes[0])
            else:
                n=nplug.ownerDocument.createNode(plug)
                node = nplug.appendChild(n)                
                return Conf(self,node)
        else:
            return Conf( self, self.__dom.getAll("conf")[0] )
            
    def save(self):
        """ enregistre la configuration """
        self.__dom.saveAs(self.__file)
        
        


if __name__ == "__main__":
    #~ try:
        #~ os.unlink("test.xml")
    #~ except:
        #~ pass

    f = FeedBox("test.xml")
    
    c = f.getConf()

    c["region"]=56
    c["region"]=( {u"kkçàak":122,23:(1,2,3)})

    print c["koko"]
    
    f.save()
